#ifndef ___STRUCT_H__
#define ___STRUCT_H__

#include <cstdint>


/* 定义产品相关数据类型最大通道数限制值 (MCU定义必须与PC定义保持一致 ) */
#define MAX_CH_MUS			( 4 )					// 最大输入通道数
#define	MAX_CH_OUT			( 8 )					// 最大输出通道数
#define	NUM_CH_MUS			( MAX_CH_MUS )			// 实际输入通道数
#define	NUM_CH_OUT			( MAX_CH_OUT )			// 实际输出通道数


/* 通道EQ最大个数 */
#define	MAX_EQ_MUS			( 15 )					// 最大输入通道EQ个数
#define	MAX_EQ_OUT			( 15 )					// 最大输出通道EQ个数
#define	NUM_EQ_MUS			( MAX_EQ_MUS )			// 实际输入通道EQ个数
#define	NUM_EQ_OUT			( MAX_EQ_OUT )			// 实际输出通道EQ个数


/* 定义各种数据类型的数据长度 */
#define DATA_LEN_MUS		sizeof( PARAM_MUS )		// 输入通道数据长度
#define DATA_LEN_OUT		sizeof( PARAM_OUT )		// 输出通道数据长度
#define	DATA_LEN_GRP		sizeof( PARAM_GROUP )	// 场景数据长度


#define	DATA_LEN_BASE		( 128 )					// 系统数据 -> 基础数据内容长度
#define	DATA_LEN_PW			( 48 )					// 系统数据 -> 密码数据内容长度
#define	DATA_LEN_AP			( 48 )					// 系统数据 -> 网络数据内容长度
#define	DATA_LEN_BT			( 32 )					// 系统数据 -> 蓝牙数据内容长度
#define	DATA_LEN_SYS		( DATA_LEN_BASE + DATA_LEN_PW + DATA_LEN_AP + DATA_LEN_BT)	// 系统数据内容总长度


#define DATA_LEN_NAME		sizeof( stCfgName )		// 名字总长度


#define	NAME_LEN_DEV		( 32 )					// 设备名称，32字节 (最后一字节强制为0)
#define NAME_LEN_GPR		( 16 )					// 模式名称，16字节 (最后一字节强制为0)
#define	NAME_LEN_CH			( 16 )					// 通道名称，16字节 (最后一字节强制为0)

#define	GRP_MAX				( 32 )					// 定义场景最大组数
#define	GRP_NUM				( 9 )					// 实际场景数


#define	NAME_MAX_GRP		( GRP_MAX )				// 定义最大场景数
#define	NAME_MAX_MUS		( 16 )
#define	NAME_MAX_OUT		( 16 )



/******************************************************************************
      设备信息结构体(内容固定不可修改，连机时读取，设备返回128字节内容)
******************************************************************************/
typedef struct
{
    uint32_t id;				// 设备唯一ID
    char name[24];			// 产品名称
    char ver_dsp[3];		// dsp固件版本号
    char ver_mcu[3];		// mcu固件版本号
    char ver_boot[3];		// bootload固件版本号

    uint8_t sample;			// 48 或 96 或192 (仅影响延时步进)
    uint8_t group;			// 场景数（比如该值定义为8，则说明有1~8个场景）
    uint8_t ap;				// 网络功能标记
    uint8_t bt;				// 蓝牙功能标记
    uint8_t fir;				// 0-没有FIR (bit0=1表示输入带FIR,    bit1=1表示输出带FIR)
    uint8_t deq;				// 0-没DEQ
    uint8_t aeq;				// 0-没AEQ
    uint8_t limt;				// 0-没限幅  (bit0=1表示输入带限幅器, bit1=1表示输出带限幅器)
    uint8_t cmps;				// 0-没限幅  (bit0=1表示输入带压缩器, bit1=1表示输出带压缩器)
    uint8_t reserve[18];		// 预留18字节

}stDevCfg;

typedef struct
{
    uint8_t max_ch;			// 最大通道数
    uint8_t tru_ch;			// 实际通道数
    uint8_t max_eq;			// 最大EQ数
    uint8_t tru_eq;			// 实际EQ数
    uint16_t max_gain;		// 最大增益限制(单位dB)
    uint16_t max_thr;			// 最大阀值限制(单位dB)
    uint16_t max_dly;			// 最大延时(单位ms)
    uint16_t max_taps;		// 最大fir阶数
    uint8_t reserve[12];		// 预留12字节

}stDevLimt;


typedef struct
{
    stDevCfg  cfg;			// 设备配置信息，占用64字节
    stDevLimt mus;			// 输入参数限制，占用24字节
    stDevLimt out;			// 输出参数限制，占用24字节
    uint8_t reserve[16];		// 预留16字节

}stCfgDev;



/******************************************************************************
                        读电平值(心跑包)返回数据格式
******************************************************************************/
typedef struct
{
    uint8_t id;				// 当前工作场景  (数值:0 ~ N)
    uint8_t temp;				// 温度值        (数值:0 ~ 165 表示温度: -40℃ ~ +125℃)
    uint8_t reserve[4];		//
    uint8_t mus[MAX_CH_MUS];	// 输入通道电平值(最高位(bit7)为压限灯, 低7位(bit6-bit0) 0 ~ 127，表示-100dB ~ +27dB)
    uint8_t out[MAX_CH_OUT];	// 输出通道是平值(最高位(bit7)为压限灯, 低7位(bit6-bit0) 0 ~ 127，表示-100dB ~ +27dB)

}stCfgPeak;




/******************************************************************************
                                系统数据结构体定义
******************************************************************************/
/* 公共配置数据结构体，共128字节 */
typedef struct
{
    /* 00    */	uint8_t language;			// 语言				value: 0-en      1-cn       default: 0
    /* 01    */	uint8_t loadid;			// 调用ID			value: 0~19                 default: 1
    /* 02    */	uint8_t saveid;			// 保存ID			value: 0~19                 default: 1
    /* 03    */	uint8_t source;			// 输入源          	value: 0~4(VOD,DVD...)      default: 0
    /* 04    */	uint8_t deviceid;			// 设备ID       	value: 1~N                  default: 1
    /* 05    */	uint8_t backlight;		// 背光状态     	value: 0-on      1-off      default: 0
    /* 06    */	uint8_t standby;			// 待机状态        	value: 0-on      1-off      default: 0
    /* 07    */	uint8_t link;				// 联调状态        	value: 0-unlick  1-link     default: 0
    /* 08    */	uint8_t mute;				// 系统静音			value: 0-unmute  1-mute     default: 0
    /* 09    */	uint8_t lock;				// 系统锁定        	value: 0-unlock  1-lock     default: 0
    /* 10    */	uint8_t baud232;			// 232波特率     	value:
    /* 11    */	uint8_t baud485;			// 485波特率      	value:
    /* 12    */	uint8_t bridge;			// 桥接模式       	value:
    /* 13    */	uint8_t volume;			// 系统音量       	value:
    /* 14    */	uint8_t temperature;		// 温度设置  	   	value:
    /* 15    */ uint8_t bass_sw;			// 低音加强开关		value: 0-off     1-on
    /* 16    */ uint8_t group;			// 设置编组			value: 0-不联调(编组)  1-联调（编组）
    /* 17~N  */	uint8_t reserve[111];		// 保留空间
}stCfgBase;

/* 密码配置数据结构体,共48字节 */
typedef struct
{// ch = 1, id=0~N
    /* 00    */	char   system[8];		// 系统密码  ( 最高权限 )
    /* 01    */	char   admin[8];		// 管理密码  ( 次高权限 )
    /* 02    */	char   user[8];			// 用户密码  ( 最低权限 )
    /* 03    */	uint16_t set;				// 次数锁设置( 0 ~ 999  )
    /* 04    */	uint16_t cnt;				// 次数锁计数
    /* 05~N  */	uint8_t  reserve[20];		// 保留空间
}stCfgPw;

/* 网络配置数据结构体，共48字节 */
typedef struct
{// ch = 2, id=0~N
    /* 00    */	char ssid[16];			// 名称
    /* 01    */	char pw[8];				// 密码
    /* 02    */	uint8_t ip[4];			// IP地址
    /* 03    */	uint32_t port;			// 端口号
    /* 05~N  */	uint8_t  reserve[16];		// 保留空间
}stCfgAp;

/* 蓝牙配置数据结构体，共32字节 */
typedef struct
{// ch = 3, id=0~N
    /* 00    */	char ssid[16];			// 名称
    /* 01    */	char pw[8];				// 密码
    /* 02    */	uint8_t vol;				// 蓝牙音量
    /* 03    */	uint8_t sw;				// bt  开/关
    /* 04    */	uint8_t tws;				// tws 开/关
    /* 05    */	uint8_t tws_lr;			// tws 左/右
    /* 06    */	uint8_t reserve[4];		// 保留空间
}stCfgBt;

/* 系统配置数据结构体 */
typedef struct
{
    stCfgBase		base;				// 共128字节  发送时ch =0，id按结构体
    stCfgPw			pw;					// 共48字节   发送时ch =1，id按结构体
    stCfgAp			ap;					// 共48字节   发送时ch =2，id按结构体
    stCfgBt			bt;					// 共32字节   发送时ch =3，id按结构体
}stCfgData;





/******************************************************************************
                                名称数据结构体
******************************************************************************/
typedef struct
{
    char dev[NAME_LEN_DEV];					/* 设备名称，     ch=0, id=0；   占用空间32*1  = 32  */
    char user[NAME_MAX_GRP][NAME_LEN_GPR];	/* 场景名称，     ch=0, id=0-n； 占用空间16*21 = 336 */
    char mus[NAME_MAX_MUS][NAME_LEN_CH];	/* 输入通道名称， ch=0, id=0-n； 占用空间16*4  = 64  */
    char out[NAME_MAX_OUT][NAME_LEN_CH];	/* 输出通道名称， ch=0, id=0-n； 占用空间16*8  = 128 */
}stCfgName;




/******************************************************************************
                                场景数据结构体定义
******************************************************************************/
/* 均衡器结构体 */
typedef struct
{
    uint16_t	freq;				// val:20 ~ 20000,  stp:1Hz,    disp:20Hz    ~ 20000Hz
    uint16_t	gain;				// val:0  ~ 360,    stp:0.1dB,  disp:-24.0dB ~ 12.0dB
    uint16_t	bw;					// val:0  ~ 299,    stp:xxx,    disp:见Q值表
    uint8_t	type;				// val:0  ~ 5,      stp:1,      disp:0-PEQ,  1-LoShf  2-HiShf  3-AP1  4-AP2  5-BYPASS
    uint8_t	reserve;			// val:0
}stDataEq;

/* 分频器结构体 */
typedef struct
{
    uint16_t	freq;				// val:20 ~ 20000,  stp:1Hz,    disp:20Hz    ~ 20000Hz
    uint8_t	filter;				// val:0 ~ 11,      stp:1Hz,    disp:L&R(12, 24, 36, 48)  Bessel(12, 24, 36, 48)  ButterW(12, 24, 36, 48)
    uint8_t	reserve;			// val:0
}stDataXover;

/* 压缩器结构体 */
typedef struct
{
    uint16_t	threshold;			// val:0 ~ 600,     stp:1dB,    disp:-48dB ~ 12dB
    uint16_t	attack;				// val:1 ~ 100,     stp:1ms,    disp:1ms   ~ 100ms
    uint16_t	decay;				// val:1 ~ 100,     stp:1ms,    disp:1ms   ~ 100ms ( attack*(2,4,6,8,16,32) )
    uint8_t	ratio;				// val:1 ~ 100,     stp:1,      disp:1:1   ~ 100:1
    uint8_t	enable;				// val:0 ~ 1,       stp:1,      disp:0-enable  1-disable
}stDataCmps;

/* 限幅器结构体 */
typedef struct
{
    uint16_t	threshold;			// val:0 ~ 60,      stp:1dB,    disp:-48dB ~ 12dB
    uint16_t	attack;				// val:1 ~ 100,     stp:1ms,    disp:1ms   ~ 100ms
    uint16_t	decay;				// val:1 ~ 100,     stp:1ms,    disp:1ms   ~ 100ms ( attack*(2,4,6,8,16,32) )
    uint8_t	ratio;				// val:1 ~ 100,     stp:1,      disp:1:1   ~ 100:1
    uint8_t	enable;				// val:0 ~ 1,       stp:1,      disp:0-enable  1-disable
}stDataLimt;

/* 噪声门结构体 */
typedef struct
{
    uint16_t	threshold;			// val:0 ~ 60,      stp:1dB,    disp:-48dB ~ 12dB
    uint16_t	attack;				// val:1 ~ 100,     stp:1ms,    disp:1ms   ~ 100ms
    uint16_t	decay;				// val:1 ~ 100,     stp:1ms,    disp:1ms   ~ 100ms ( attack*(2,4,6,8,16,32) )
    uint8_t	ratio;				// val:1 ~ 100,     stp:1,      disp:1:1   ~ 100:1
    uint8_t	enable;				// val:0 ~ 1,       stp:1,      disp:0-enable  1-disable
}stDataNsgt;

/* 混音器结构体 */
typedef struct
{
    uint8_t	vol;				// val:0 ~ 100,      stp:1dB,    disp:-48dB ~ 12dB
    uint8_t	phase;				// val:0 ~ 1		 stp:1
}stDataMixer;

/* FIR数据结构体 */
typedef struct
{
    uint8_t	state;				// 0：关闭Fir      1：启动FIR
    uint8_t 	reservel;			// 保留
    float	coef[256];			// Fir系数
}PARAM_FIR;

/* 输入通道结构体 */
typedef struct
{
    uint8_t	mute;				// val:0 ~ 1,		stp:1,    disp:0-normal   1-mute
    uint8_t	phase;				// val:0 ~ 1,		stp:1,    disp:0-normal   1-Invert
    uint8_t	source;				// 预留
    uint8_t	fbx;				// 预留
    uint16_t	gain;				// val:0 ~ 920,		stp:1,    disp:-80.0dB ~ 12.0dB, 显示步进:0.1dB  (最大值由设备读取)
    uint16_t	delay;				// val:0 ~ 4800,	stp:1,    disp:0ms     ~ 100ms,  显示步进:1/FSms (最大值由设备读取,FS由设备读取)

    stDataCmps	cmps;			// 压缩器结构体
    stDataNsgt	nsgt;			// 噪声门结构体
    stDataXover	xover[2];		// 分频器结构体
    stDataEq	eq[MAX_EQ_MUS];	// 均衡器结构体

}PARAM_MUS;


/* 输出通道结构体 */
typedef struct
{
    uint8_t	mute;				// val:0 ~ 1,		stp:1,    disp:0-normal   1-mute
    uint8_t	phase;				// val:0 ~ 1,		stp:1,    disp:0-normal   1-Invert
    uint8_t	source;				// 预留
    uint8_t	fbx;				// 预留
    uint16_t	gain;				// val:0 ~ 920,		stp:1,    disp:-80.0dB ~ 12.0dB, 显示步进:0.1dB  (最大值由设备读取)
    uint16_t	delay;				// val:0 ~ 4800,	stp:1,    disp:0ms     ~ 100ms,  显示步进:1/FSms (最大值由设备读取,FS由设备读取)

    stDataCmps	cmps;			// 压缩器结构体
    stDataLimt	limt;			// 限幅器结构体
    stDataXover	xover[2];		// 分频器结构体
    stDataEq	eq[MAX_EQ_OUT];	// 均衡器结构体
    stDataMixer	mixer[4];		// 混音器结构体
}PARAM_OUT;

/* 场景数据结构体 (场景数据由全部 输入通道数据+输出通道数据 组成) */
typedef	struct
{
    PARAM_MUS		MusCh[MAX_CH_MUS];
    PARAM_OUT		OutCh[MAX_CH_OUT];
    //PARAM_FIR		Fir[MAX_CH_OUT];
}PARAM_GROUP;









/******************************************************************************
                                通道序号表
******************************************************************************/
enum TYPE_CH : uint8_t
{
    MUS_CH1 = 0x00,
    MUS_CH2,
    MUS_CH3,
    MUS_CH4,

    OUT_CH1 = 0x10,
    OUT_CH2,
    OUT_CH3,
    OUT_CH4,
    OUT_CH5,
    OUT_CH6,
    OUT_CH7,
    OUT_CH8,
};




enum PC_MSG_CMD : uint8_t
{
    /* 写参数命令(预留：最高位为1时为读参数命令) */
    CMD_ID_MUTE  = 0x01,	// 01 -> 静音
    CMD_ID_PHASE,			// 02 -> 相位
    CMD_ID_GAIN,			// 03 -> 增益
    CMD_ID_DELAY,			// 04 -> 延时
    CMD_ID_FBX,				// 05 -> 反馈
    CMD_ID_CPRS,			// 06 -> 压缩
    CMD_ID_LIMT,			// 07 -> 压限
    CMD_ID_NSGT,			// 08 -> 噪声门
    CMD_ID_XOVER,			// 09 -> 分频器
    CMD_ID_PEQ,				// 0A -> 均衡器
    CMD_ID_SRC,				// 0B -> 输入源选择
    CMD_ID_MIXER,			// 0C -> 输出路由输入源
    CMD_ID_DEQ,				// 0D -> 动态EQ
    CMD_ID_FIR,				// 0E -> FIR
    CMD_ID_TONE,			// 0F -> 变调
    CMD_ID_EFF,				// 10 -> 效果


    /* 只读命令 */
    CMD_ID_R_INFO = 0x20,	// 20 -> 读设备信息
    CMD_ID_R_PEAK,			// 21 -> 读电平值等()
    CMD_ID_UPGRADE,			// 22 -> 系统升级


    /* （联机、先读系统数据,再调用当前数据） */
    CMD_ID_R_SYS = 0x30,	// 30 -> 读系统数据
    CMD_ID_W_SYS,			// 31 -> 写系统数据
    CMD_ID_R_NAME,			// 32 -> 读场景、通道名称
    CMD_ID_W_NAME,			// 33 -> 写场景、通道名称
    CMD_ID_R_CH,			// 34 -> 读通道数据
    CMD_ID_W_CH,			// 35 -> 写通道数据
    CMD_ID_R_FIR,			// 36 -> 读FIR数据命令
    CMD_ID_W_FIR,			// 37 -> 写FIR数据命令
    CMD_ID_LOAD,			// 38 -> 调用场景
    CMD_ID_SAVE,			// 39 -> 保存场景
    CMD_ID_EXPORT,			// 3A -> 导出场景
    CMD_ID_IMPORT,			// 3B -> 导入场景
    CMD_ID_EXPORT_ALL,		// 3C -> 导出全部场景
    CMD_ID_IMPORT_ALL,		// 3D -> 导入全部场景

    CMD_ID_COPY = 0x50,		// 50 -> 通道拷贝
    CMD_ID_RST,				// 51 -> EQ复位
    CMD_ID_BYPASS,			// 52 -> EQ直通
    CMD_ID_W_GROUP,			// 53 -> PC把当前数据写到设备

};


#define	CMD_ACK_T	'T'		// none error
#define	CMD_ACK_F	'F'		// crc error
#define	CMD_ACK_N	'N'		// not handled
#define	CMD_ACK_O	'O'		// over flow error













/******************************************************************************
                          参数最大值、最小值、默认值
******************************************************************************/

/*
 增益显示:-80.0dB ~ +12.0dB		步进:0.1dB  	 默认:0dB    ( 数值范围:0 ~ 920 )

 静音显示:非静音/静音       	步进:1      	 默认:非静音 ( 数值范围:0 ~ 1 )

 相位显示:+/-               	步进:1      	 默认:+      ( 数值范围:0 ~ 1 )

 延时显示:0ms ~ 100ms       	步进:1/FS   	 默认:0ms    ( 数值范围:0 ~ 4800(FS由设备读取))

 噪 声 门:-80dB ~ -30dB    		步进:1dB    	 默认:-75dB  ( 数值范围:0 ~ 50)


 参量均衡
 频率显示:20Hz ~ 20000Hz		步进:1Hz		默认:--     ( 数值范围:20 ~ 20000 )
 增益显示:-24.0dB ~ 12.0dB		步进:0.1dB		默认:0dB    ( 数值范围:0  ~ 360 )
 Q值显示 :0.404 ~ 128			步进:查表		默认:1      ( 数值范围:0  ~ 295 )

 分频器
 频率显示:20Hz ~ 20000Hz		步进:1Hz		默认:--     ( 数值范围:20 ~ 20000 )
 滤 波 器:Bessel,ButW,R&L		步进:1			默认:Bessel ( 数值范围:0  ~ 2 )
 斜率增益:12,24,36,48dB     	步进:1			默认:12dB   ( 数值范围:0  ~ 3 )

 压缩器/限幅器
 启动阀值:-48.0dB ~ 12.0dB     	步进:0.1dB		默认:12dB   ( 数值范围:0  ~ 600 ) 12由设备读取
 启动时间:1ms     ~ 200ms      	步进:1ms		默认:3ms    ( 数值范围:1  ~ 200 )
 释放时间:1ms     ~ 5000ms     	步进:1ms		默认:200ms  ( 数值范围:1  ~ 5000 )
 压缩比例:1     ~ 100           步进:1          默认:10     ( 数值范围:1  ~ 100 )
*/




#endif
